<?php

/**
 * Access Action - Controlleur pour les accès à l'application
 *
 * @package
 * @author Alexis Eric, 
 * Erra Prod. http://www.erraprod.com
 * @copyright Copyright (c) 2012 - Erra Prod
 * @access public
 */
class AccessAction extends Erra_System_Action {

    /**
     * loginUser - Log un admin dans le système 
     * (appelé par Access_LoginObject sur Back_Login.phtml)
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function loginUser(Erra_Fields_Base_Object $field) {
        if (!filter_var($field->username->value, FILTER_VALIDATE_EMAIL)) {
            $field->username->setError('Veuillez entrer une adresse mail valide');
        }
        if (!strlen($field->password->value)) {
            $field->password->setError('Veuillez entrer un mot de passe');
        }
        if (!$field->bErrors()) {
            // Si l'utilisateur existe on le redirige vers la page d'accueil (DefaultLayout.phtml(Back_Index.phtml))
            $result = Erra_Core_DatabasePdo::SELECT('SELECT * FROM access_accessobject WHERE email="' . $field->username->value . '" AND mot_de_passe="' . __crypt($field->password->value) . '"');
            $row = $result->fetch();
            if (is_object($row) && $row->email == $field->username->value) {
                $row->server_infos = Access_AuthObject::getServerInfos();
                Erra_Persistance_Session::set('login_infos', $row);
                return 'REDIRECT::default';
            } else {
                $field->setError('Les identifiants sont incorrects');
            }
        }

        return 'FORM_REFRESH_FIELD';
    }

    /**
     * createAdmin() - Méthode de création des utilisateurs de l'application
     * (appelé par Access_AccessObject sur Back_RegisterAdmin.phtml)
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function createAdmin(Erra_Fields_Base_Object $field) {
        if (!strlen($field->nom->value)) {
            $field->nom->setError('Veuillez entrer un nom');
        }
        if (!strlen($field->prenom->value)) {
            $field->prenom->setError('Veuillez entrer un prénom');
        }
        if (!filter_var($field->email->value, FILTER_VALIDATE_EMAIL)) {
            $field->email->setError('Veuillez entrer une addresse e-mail valide');
        }
        Erra_Core_DatabasePdo::SELECT('SELECT id FROM access_accessobject WHERE email="' . $field->email->value . '"');
        if (Erra_Core_DatabasePdo::rowCount()) {
            $field->email->setError('Cette adresse e-mail est déja utilisée');
        }

        if (!strlen($field->mot_de_passe->getRawData())) {
            $field->mot_de_passe->setError('Veuillez entrer un mot de passe');
        } else {
            if ($field->mot_de_passe->getRawData() != $field->mot_de_passe_confirm->getRawData()) {
                $field->mot_de_passe->setError('Les mots de passe ne correspondent pas');
                $field->mot_de_passe->setValue('');
                $field->mot_de_passe_confirm->setValue('');
            }
        }
        if ($field->bErrors()) {
            $field->setError('Veuillez corriger les erreurs sur le formulaire');
        } else {
            // On prépare les données avant insertion
            $mot_de_passe = $field->mot_de_passe->value;
            $fullName = $field->nom->value . ' ' . $field->prenom->value;
            // On envoie un mail à l'utilisateur fraichement créé
            $placeHolders = array('{admin_mail}' => $field->email->value,
                '{admin_password}' => $mot_de_passe,
                '{nom_complet}' => $fullName);
            $result = Erra_Utils_Tools::sendTemplatedMail($field->email->value, 'Mail/Mail_AdminRegister.phtml', $placeHolders);
            $field->mot_de_passe->setValue(__crypt($field->mot_de_passe->value));
            $field->mot_de_passe_confirm->setValue(__crypt($field->mot_de_passe_confirm->value));
            self::saveSql($field);
            return 'REDIRECT::login';
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * saveProfileEdit() - Saves admin profile
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveProfileEdit(Erra_Fields_Base_Object $field) {
        $userExists = false;
        if (!strlen($field->nom->value)) {
            $field->nom->setError('Veuillez entrer un nom');
        }
        if (!strlen($field->prenom->value)) {
            $field->prenom->setError('Veuillez entrer un prénom');
        }
        if (strlen($field->portable->value)) {
            $portable = $output = preg_replace('/[^0-9]/', '', $field->portable->value);
            if (strlen($portable) != 10 || (substr($portable, 0, 2) != '06' && substr($portable, 0, 2) != '07')) {
                $field->portable->setError('Le numéro de téléphone doit contenir 10 chiffres et commencer par 06 ou 07');
            }
        }
        if (!filter_var($field->email->value, FILTER_VALIDATE_EMAIL)) {
            $field->email->setError('Veuillez entrer une addresse e-mail valide');
        } else {
            $row = Erra_Core_DatabasePdo::SELECT('SELECT * FROM access_accessobject WHERE email="' . $field->email->value . '" ');
            if (Erra_Core_DatabasePdo::rowCount()) {
                $row = $row->fetch();
                if ($field->getId() != $row->id) {
                    $field->email->setError("L'adresse e-mail existe déja");
                } else {
                    $userExists = true;
                }
            }
        }

        if (!strlen($field->mot_de_passe->value) && !$userExists) {
            $field->mot_de_passe->setError('Veuillez entrer un mot de passe');
        }
        if (strlen($field->mot_de_passe->value)) {
            if ($field->mot_de_passe->value != $field->mot_de_passe_confirm->value) {
                $field->mot_de_passe->setError('Les mots de passe ne correspondent pas');
            } else {
                $mot_de_passe = $field->mot_de_passe->value;
                $field->mot_de_passe->setValue(__crypt($field->mot_de_passe->value));
                $field->mot_de_passe_confirm->setValue(__crypt($field->mot_de_passe_confirm->value));
            }
        }

        if ($field->bErrors()) {
            $field->setError('Veuillez corriger les erreurs sur le formulaire');
        } else {
            // Si l'utilisateur existe déja, récuperer le mot de passe depuis la baes de données
            if (!strlen($field->mot_de_passe->value) && $userExists) {
                $mot_de_passe = Erra_Core_DatabasePdo::SELECT('SELECT mot_de_passe FROM access_accessobject WHERE id=' . $field->getId());
                if (Erra_Core_DatabasePdo::rowCount()) {
                    $mot_de_passe = $mot_de_passe->fetch();
                    $mot_de_passe = $mot_de_passe->mot_de_passe;
                    $field->mot_de_passe->setValue($mot_de_passe);
                    $field->mot_de_passe_confirm->setValue($mot_de_passe);
                }
            }
            self::saveSql($field);
            // On récupere l'id de l'utilisateur
            $id = $field->getId();
            if (!$userExists) {
                $mail = Erra_Core_DatabasePdo::SELECT('SELECT id FROM access_accessobject WHERE email="' . $field->email->value . '"');
                $mail = $mail->fetch();
                $id = $mail->id;
                // Si l'utilisateur n'existe pas, on envoie un mail acontenant le mot de passe et le nom d'utilisateur
                $fullName = $field->nom->value . ' ' . $field->prenom->value;
                $placeHolders = array('{admin_mail}' => $field->email->value, '{admin_password}' => $mot_de_passe, '{nom_complet}' => $fullName);
                $result = Erra_Utils_Tools::sendTemplatedMail($field->email->value, 'Mail/Mail_AdminRegister.phtml', $placeHolders);
            }

            // On récupère les infos de login utilisateur
            $user_infos = Erra_Persistance_Session::get('login_infos');
            // User can't edit it's own agendas
            if ($field->getId() != $user_infos->id) {
                $agendas_array = strstr($field->agendas->getValue(), '§') ? explode('§', $field->agendas->getValue()) : array($field->agendas->getValue());
                self::assignTableKeyValues(array('table' => 'back_agenda_access', 'key' => 'access_id', 'value' => 'agenda_id'), $field->getId(), $agendas_array);
                // Force location setting for a simple admin editing someone else access
                if (Access_ControlObject::getAdminLevel($user_infos->id) == 1) {
                    // Get current location
                    Erra_Core_DatabasePdo::EXECUTE('UPDATE access_accessobject SET location="' . $user_infos->location . '" WHERE id=' . $id);
                }
            }
            Config_ConfigObject::loadConfiguration($field->getId());
            $agenda_str = $field->agendas->getRawData();
            Erra_Core_DatabasePdo::EXECUTE('UPDATE config_configobject SET afficher_agendas="' . $agenda_str . '" WHERE user_id=' . $id);
            if (!$userExists) {
                return "FORM_CLOSE_POPUP::erraSuccess('Utilisateur correctement créé')";
            } else {
                return "FORM_CLOSE_POPUP::erraSuccess('Utilisateur correctement modifié')";
            }
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * sendPassword - Renvoyer le mot de passe à l'administrateur
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function sendPassword(Erra_Fields_Base_Object $field) {
        $mot_de_passe = '';
        if (strlen($field->email->value)) {
            if (!filter_var($field->email->value, FILTER_VALIDATE_EMAIL)) {
                $field->email->setError('Veuillez entrer une addresse e-mail valide');
            } else {
                $row = Erra_Core_DatabasePdo::SELECT('SELECT nom, prenom, mot_de_passe FROM access_accessobject WHERE email="' . $field->email->value . '" ');
                if (Erra_Core_DatabasePdo::rowCount()) {
                    $row = $row->fetch();
                    $mot_de_passe = (string)__decrypt($row->mot_de_passe);
                } else {
                    $field->email->setError("Cette adresse e-mail n'est pas attachée à un compte administrateur");
                }
            }
        } else {
            $field->email->setError('Veuillez entrer une addresse e-mail valide');
        }

        if (!$field->bErrors() && strlen($mot_de_passe)) {
            $fullName = $row->nom . ' ' . $row->prenom;
            $placeHolders = array('{admin_mail}' => $field->email->value, '{admin_password}' => (string)$mot_de_passe, '{nom_complet}' => (string)$fullName);
            $result = Erra_Utils_Tools::sendTemplatedMail($field->email->value, 'Mail/Mail_AdminPasswordForgot.phtml', $placeHolders);
            if ($result == true) {
                $field->setSuccess('Votre mot de passe a été correctement renvoyé');
            } else {
                $field->setWarning('Une erreur est survenue lors du renvoi de votre mot de passe');
            }
            $field->reset();
        }
        return 'FORM_REFRESH_FIELD';
    }

}